package net.facelib.jni;

import net.facelib.jni.SdkRuntime.RuntimeConsumer;

public interface RuntimeParamAccessor{
	/**
	 * 调用设置{@link RuntimeConsumer}实例的运行参数,
	 * 优先为设置当前线程的局部参数,然后是全局参数,
	 * 如果两个变量中都没定义name指定的参数,则忽略.
	 * @param instance SDK实例
	 * @param name 参数名
	 */
	void setInstanceParam(RuntimeConsumer instance, String name);
	/**
	 * 删除保存在线程局部变量的运行参数<br>
	 * {@link #setLocalRuntimeParam(String, Object)}方法设置的参数保存在线程局部变量中(thread local variable),
	 * 如果使用该方法设置了运行时参数，则在线程调用结束时需要调用本方法删除线程局部变量，否则可能会引起资源泄露
	 * @return 当前对象
	 */
	SdkRuntime removeLocalRunTimeParam();
	/**
	 * 设置运行时参数,对当前线程的实例有效<br>
	 * 参数名为null时抛出{@link IllegalArgumentException}异常<br>
	 * 参数值为null时设置为默认的参数
	 * @param name 参数名
	 * @param value 参数值,数据类型必须参数名的要求
	 * @return 当前对象
	 */
	SdkRuntime setLocalRuntimeParam(String name, Object value);
	/**
	 * 设置运行时参数,对所有线程和实例有效<br>
	 * 参数名为null时抛出{@link IllegalArgumentException}异常<br>
	 * 参数值为null时设置为默认的参数
	 * @param name 参数名
	 * @param value 参数值,数据类型必须参数名的要求
	 * @return 当前对象
	 */
	SdkRuntime setGlobalRuntimeParam(String name, Object value);
	/**
	 * 返回指定名字的运行时参数<br>
	 * 优先查找当前线程的运行时参数,找不到则返回全局参数,找不到返回默认值{@code defaultValue}
	 * @param name 参数名
	 * @param defaultValue 默认值
	 * @return 参数值
	 */
	<T> T getRuntimeParam(String name, T defaultValue);
	
}